#ifndef CONFIG_H
#define CONFIG_H

#include "gd32f30x.h"

// 内部晶振
#define INTCLK                      48000000UL

// 通讯波特率
#define BAUDRATE                    115200

// 使用UART1
//#define _USES_UART1

// UART1波特率
#define UART1_BAUDRATE              115200

#define MOVE_METHOD_SEQUENCE        0
#define MOVE_METHOD_INDEPENDENT     1
#define MOVE_METHOD_INTERP          2

// xy移动方法: 0 - 顺序运行; 1 - 单独运行; 2 - 插补运行.
#define MOVE_METHOD                 MOVE_METHOD_INDEPENDENT

// UART1通讯最大重试次数
#define UART1_MAX_RETRY_TIMES       5

#ifdef PRODUCT_DEBUG
// 忽略所有Z, 用于单独调试XY
//#define IGNORE_Z
//#define IGNORE_PICKUP_ERROR
#endif

// 自动定位时的速度, mm/sec
#define MEASURE_SPEED               3

// 自动定位测量高度时, X方向离边的距离, mm
#define MEASURE_OFFSET              0.5

// 抓杯/退杯相对位移, mm
#define PICKUP_CUP_OFFSET           6

// 抓杯时多走的相对位移, mm
#define PICKUP_CUP_EXTRA_OFFSET     0

// 抓杯时动作延迟时间, us
#define PICKUP_CUP_DELAY            300000UL

// 退杯时动作延迟时间, us
#define RELEASE_CUP_DELAY           500000UL

// XY运行区域中, 最大的禁止(障碍)区域数量
#define MAX_BLOCK_COUNT             1

// 允许定位时使用细分
#define ENABLE_MEASURE_MICROSTEP

// 允许使用另一个臂速度作为参考速度, 来调整当前臂最大速度
// #define ENABLE_REF_SPEED

// 电机脉冲输出使用50%占空比
// #define PULSE_DUTY_CYCLES_50

// Z减速比
#define Z_REDUCTION_RATIO           (1/4.8)

// Z电机转一圈的距离, mm
#define Z_PERIMETER                 (Z_REDUCTION_RATIO * 6.35)

// Y电机转一圈的距离, mm
#define Y_PERIMETER                 (14 * 2.032)

// 抓手或测试位定位销/孔之间距离, mm
#define LOCATION_PERIMETER          30

// Z电机检测到测试杯后往下走的距离, mm
#define Z_PROBE_DISTANCE            0.0

// Z电机放杯时检测到测试杯后往下走的距离, mm
#define Z_RELEASE_DISTANCE          1.0

// Z从底部向上关闭电磁铁距离, mm
#define Z_CLOSE_MAGENT_DISTANCE     7.0

// Y电机检测到限值位后往下走的距离, mm
#define Y_LIMIT_DISTANCE            1.5

// 抓杯时, 检测到抓杯信号后回退的距离, mm
#define PICK_CUP_ROLLBACK           0.5

// 抓杯/放杯时使用抓杯传感器检测抓/放杯高度
// 当不使用该传感器时直接下降到设定的最大位置
#define USE_PICK_CUP_SENSOR         0

// 下降时检测下降到位信号,但不作为限位停止依据
#define CHECK_PICK_CUP_SENSOR       0

// XY移动时躲避障碍物
// #define AVOID_OBSTACLES
// 扔杯时需检测到位信号再扔
#define CHECK_RELEASE_CUP_STATE         1

// 含x运动方向电机
#define WITH_X                          0

// X电机螺距, mm
#define X_SCREW_PITCH                   2.44

// X电机转一圈的距离, mm
#define X_PERIMETER                     X_SCREW_PITCH

// X电机复位的缓冲步数, step
#define X_RESET_BUFFER_STEP             165

// X电机最大运行距离, step,目前设置为:
// X_DISTANCE_BOTTOM_TO_HOME + X_DISTANCE_HOME_TO_TOP - X_DISTANCE_STEP_OPEN_TO_TOP
#define X_MAX_DISTANCE_STEP             1089

// X最大速度,0.01rad/s
#define X_MAX_SPEED                     4000

// X电机打开抓手位置坐标，step
#define X_PICKER_OPENED_POS             680

// X电机复位光耦判断使用滤波
#define X_HOME_FILTER_ENABLE            1

// X允许电机进行零点位置矫正的最小误差步数，step
#define X_HOME_MIN_ERR_STEP             50

// X底部到光耦零点限位位置距离，mm
#define X_DISTANCE_BOTTOM_TO_HOME       2.50f

// X光耦零点到(抓手打开方向)顶部限位位置距离，mm
#define X_DISTANCE_HOME_TO_TOP          7.75f

// M底部到光耦零点限位位置距离，step
#define X_DISTANCE_STEP_BOTTOM_TO_HOME  (ulong)((float)SPR*X_DISTANCE_BOTTOM_TO_HOME/X_SCREW_PITCH)

// M光耦零点到(抓手打开方向)顶部限位位置距离，mm
#define X_DISTANCE_STEP_HOME_TO_TOP     (ulong)((float)SPR*X_DISTANCE_HOME_TO_TOP/X_SCREW_PITCH)

// M抓手打开位置到顶部限位位置距离，step
#define X_DISTANCE_STEP_OPEN_TO_TOP     (X_DISTANCE_STEP_HOME_TO_TOP - X_PICKER_OPENED_POS)

// M电机霍尔传感器启用阈值（剩余步数）
#define M_HALL_DETECTION_THRESHOLD      200

#endif // CONFIG_H
